/**
 * 日期时间工具函数
 * 提供常用的日期格式化、解析、计算等功能
 */

/**
 * 格式化日期
 * @param {Date|string|number} date - 可被Date解析的日期值
 * @param {string} format - 格式字符串，默认'YYYY-MM-DD HH:mm:ss'
 * @returns {string} 格式化后的日期字符串
 */
export function formatDate(date, format = 'YYYY-MM-DD HH:mm:ss') {
    if (!date) return '';
    
    const d = new Date(date);
    if (isNaN(d.getTime())) return '';
  
    const padZero = (num) => String(num).padStart(2, '0');
  
    return format
      .replace('YYYY', d.getFullYear())
      .replace('YY', String(d.getFullYear()).slice(-2))
      .replace('MM', padZero(d.getMonth() + 1))
      .replace('DD', padZero(d.getDate()))
      .replace('HH', padZero(d.getHours()))
      .replace('hh', padZero(d.getHours() % 12 || 12))
      .replace('mm', padZero(d.getMinutes()))
      .replace('ss', padZero(d.getSeconds()))
      .replace('ms', padZero(d.getMilliseconds()))
      .replace('A', d.getHours() < 12 ? 'AM' : 'PM')
      .replace('a', d.getHours() < 12 ? 'am' : 'pm');
  }
  
  /**
   * 计算两个日期之间的时间差
   * @param {Date|string|number} startDate - 开始日期
   * @param {Date|string|number} endDate - 结束日期（默认为当前时间）
   * @returns {object} 包含天、小时、分钟、秒和毫秒的对象
   */
  export function dateDiff(startDate, endDate = new Date()) {
    const start = new Date(startDate);
    const end = new Date(endDate);
    
    if (isNaN(start.getTime())) throw new Error('Invalid start date');
    if (isNaN(end.getTime())) throw new Error('Invalid end date');
    
    const diff = Math.abs(end - start);
    
    return {
      days: Math.floor(diff / (1000 * 60 * 60 * 24)),
      hours: Math.floor((diff % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)),
      minutes: Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60)),
      seconds: Math.floor((diff % (1000 * 60)) / 1000),
      milliseconds: diff % 1000
    };
  }
  
  /**
   * 日期加法
   * @param {Date} date - 基准日期
   * @param {number} value - 要添加的数值
   * @param {string} unit - 单位（days, months, years, hours, minutes, seconds）
   * @returns {Date} 计算后的新日期
   */
  export function addDate(date, value, unit = 'days') {
    const d = new Date(date);
    
    switch (unit.toLowerCase()) {
      case 'days':
        d.setDate(d.getDate() + value);
        break;
      case 'months':
        d.setMonth(d.getMonth() + value);
        break;
      case 'years':
        d.setFullYear(d.getFullYear() + value);
        break;
      case 'hours':
        d.setHours(d.getHours() + value);
        break;
      case 'minutes':
        d.setMinutes(d.getMinutes() + value);
        break;
      case 'seconds':
        d.setSeconds(d.getSeconds() + value);
        break;
      default:
        throw new Error(`Unsupported unit: ${unit}`);
    }
    
    return d;
  }
  
  /**
   * 将时间戳转换为相对时间描述（例如：刚刚，5分钟前）
   * @param {Date|string|number} date - 日期
   * @param {Date} now - 当前时间，默认为 new Date()
   * @returns {string} 相对时间描述
   */
  export function relativeTime(date, now = new Date()) {
    const d = new Date(date);
    if (isNaN(d.getTime())) return '';
    
    const diff = (now - d) / 1000; // 秒数差
    
    if (diff < 60) {
      return '刚刚';
    } else if (diff < 3600) {
      return `${Math.floor(diff / 60)}分钟前`;
    } else if (diff < 86400) {
      return `${Math.floor(diff / 3600)}小时前`;
    } else if (diff < 2592000) {
      return `${Math.floor(diff / 86400)}天前`;
    } else {
      return formatDate(d, 'YYYY年MM月DD日');
    }
  }
  
  /**
   * 检查日期是否为今天
   * @param {Date|string} date - 日期
   * @returns {boolean} 如果是今天返回true
   */
  export function isToday(date) {
    const d = new Date(date);
    const today = new Date();
    return d.getDate() === today.getDate() &&
           d.getMonth() === today.getMonth() &&
           d.getFullYear() === today.getFullYear();
  }
  
  /**
   * 获取日期所在月份的第一天
   * @param {Date} date - 日期
   * @returns {Date} 月份第一天
   */
  export function startOfMonth(date) {
    const d = new Date(date);
    return new Date(d.getFullYear(), d.getMonth(), 1);
  }
  
  /**
   * 获取日期所在月份的最后一天
   * @param {Date} date - 日期
   * @returns {Date} 月份最后一天
   */
  export function endOfMonth(date) {
    const d = new Date(date);
    return new Date(d.getFullYear(), d.getMonth() + 1, 0);
  }
  
  /**
   * 获取日期所在周的周一
   * @param {Date} date - 日期
   * @param {number} startDay - 一周开始于周几（0为周日，1为周一，默认为1）
   * @returns {Date} 当周的第一天（周一）
   */
  export function startOfWeek(date, startDay = 1) {
    const d = new Date(date);
    const day = d.getDay();
    const diff = (day < startDay ? 7 : 0) + day - startDay;
    d.setDate(d.getDate() - diff);
    return d;
  }
  
  /**
   * 获取日期所在周的周日
   * @param {Date} date - 日期
   * @param {number} startDay - 一周开始于周几（0为周日，1为周一，默认为1）
   * @returns {Date} 当周的最后一天（周日）
   */
  export function endOfWeek(date, startDay = 1) {
    const d = startOfWeek(date, startDay);
    d.setDate(d.getDate() + 6);
    return d;
  }
  
  /**
   * 判断两个日期是否相等（忽略时间）
   * @param {Date} date1 - 日期1
   * @param {Date} date2 - 日期2
   * @returns {boolean} 如果年月日相同则返回true
   */
  export function isSameDate(date1, date2) {
    const d1 = new Date(date1);
    const d2 = new Date(date2);
    return d1.getFullYear() === d2.getFullYear() &&
           d1.getMonth() === d2.getMonth() &&
           d1.getDate() === d2.getDate();
  }
  
  // 默认导出所有函数
  export default {
    formatDate,
    dateDiff,
    addDate,
    relativeTime,
    isToday,
    startOfMonth,
    endOfMonth,
    startOfWeek,
    endOfWeek,
    isSameDate
  };